delitos_cat_bc_URB <- readRDS("data/delitos/delitos_eval_bcom_urb.rds")3 Datos de Panel
Transformación a Datos de Panel
3.1 Introducción
En estadística y econometría, el término de datos de panel se refiere a datos que combinan una dimensión temporal con otra transversal.
Un conjunto de datos que recoge observaciones de un fenómeno a lo largo del tiempo se conoce como serie temporal. Dichos conjuntos de datos están ordenados y la información relevante respecto al fenómeno estudiado es la que proporciona su evolución en el tiempo. Un conjunto transversal de datos contiene observaciones sobre múltiples fenómenos en un momento determinado. En este caso, el orden de las observaciones es irrelevante.
Un conjunto de datos de panel recoge observaciones sobre múltiples fenómenos a lo largo de determinados períodos. La dimensión temporal enriquece la estructura de los datos y es capaz de aportar información que no aparece en un único corte.
Para nuestro caso los datos de panel serán la densidad de delitos por zona censal y el orden temporal será construido con el mes y el año eso es lo que sale a continuación.
3.2 Cálculo de Total Delitos por Espacio y tiempo
En este punto se procederá a crear tablas de cálculo de total casos policiales por espacio las zonas censales, mientras que tiempo las variables de mes y año.

Primeramente se debe extraer mes y año de la variable fecha para esto se hará uso de la librería Lubridate para manipulación de la variables temporales.
# Agregar la variable mes
delitos_urb <- delitos_cat_bc_URB %>%
st_drop_geometry() %>%
rename(fecha = FECHA_DEL) %>%
mutate(mes = month(fecha),
anno = year(fecha)) %>%
filter(!is.na(Categoria))
head(delitos_urb %>% select(fecha, mes, anno))A continuación se creará una tabla temporal que permitirá hacer una contabilidad de todos los delitos ocurridos por Zona censal, categoría, mes y año.
# todos los delitos
tab_del_all <- delitos_urb%>%
mutate(a_mes = paste0( anno, "_", sprintf("%02d",mes))) %>%
group_by(GEOCODIGO, Categoria, a_mes )%>%
summarise(Cantidad = n(), .groups = "keep")
head(tab_del_all)A continuación se procede a generar el cálculo de la suma de todos los eventos policiales ocurridos por cada zona censal categoría mes y año utilizando la librería Tidyr con la función pivot_wider()

tab_del_all_mes <- tab_del_all%>%
pivot_wider(names_from = a_mes, values_from = Cantidad,
names_prefix = "a_", values_fill = 0)%>%
dplyr::select(GEOCODIGO, Categoria,sort(names(.)[3:ncol(.)]))
head(tab_del_all_mes)#guargar resultados
write.xlsx(tab_del_all_mes,
"data/tablas/tablas_del_mes/del_zonas_all.xlsx", overwrite = T)
saveRDS(tab_del_all_mes, "data/tablas/tablas_del_mes/del_zonas_all.rds")3.3 Cálculo de tablas de densidad casos policiales
Lectura de Zonas Urbanas consolidadas
zonas <- readRDS("data/ine/zonas_urb_consolidadas.rds")
info_zonas_base <- zonas %>%
st_drop_geometry() %>%
dplyr::select(GEOCODIGO = COD_INE_16, AREA) %>%
mutate(GEOCODIGO = as.character(GEOCODIGO))Calcular delitos anual y agregar área
tab_del_all_mes <- tab_del_all_mes %>%
as.data.frame() %>% #acelera el proceso
mutate(anual = rowSums(across(.cols = starts_with("a_")))) %>%
left_join(info_zonas_base, by = "GEOCODIGO")Calcular la densidad delitos por Hectárea (10000 metros)
tab_all_dens <- tab_del_all_mes %>%
mutate(across(starts_with("a_"), ~ .x/(AREA/10000))) %>%
mutate(dens_anual = anual / (AREA/10000))
head(tab_all_dens[,1:10])Guardar resultados
write.xlsx(tab_all_dens,
"data/tablas/tabla_dens_mes/del_dens_all.xlsx",
overwrite = T)
saveRDS(tab_all_dens, "data/tablas/tabla_dens_mes/del_dens_all.rds")3.4 Tablas de Densidad de Delitos por Mes (2017 al 2022)
Unir Tablas
info_zonas_base <- zonas %>%
dplyr::select(GEOCODIGO = COD_INE_16, REGION,
NOM_REGION, COMUNA, NOM_COMUNA) %>%
mutate(GEOCODIGO = as.character(GEOCODIGO))
del_dens_zonas <- info_zonas_base %>%
left_join(tab_all_dens, by ="GEOCODIGO")
head(del_dens_zonas[,1:10])Simple feature collection with 6 features and 10 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 417007.9 ymin: 7731793 xmax: 467736.3 ymax: 7761723
Projected CRS: WGS 84 / UTM zone 19S
GEOCODIGO REGION NOM_REGION COMUNA NOM_COMUNA
1 1405011001 01 REGIÓN DE TARAPACÁ 1405 PICA
2 1405011001 01 REGIÓN DE TARAPACÁ 1405 PICA
3 1405011001 01 REGIÓN DE TARAPACÁ 1405 PICA
4 1405011001 01 REGIÓN DE TARAPACÁ 1405 PICA
5 1401011001 01 REGIÓN DE TARAPACÁ 1401 POZO ALMONTE
6 1401011001 01 REGIÓN DE TARAPACÁ 1401 POZO ALMONTE
Categoria a_2017_01 a_2017_02 a_2017_03 a_2017_04
1 Armas y homicidios 0.001071077 0.000000000 0 0
2 Comercio ilegal 0.000000000 0.000000000 0 0
3 Drogas y mercados criminales 0.006426460 0.001071077 0 0
4 Hurtos, robos 0.000000000 0.000000000 0 0
5 Armas y homicidios 0.005149346 0.000000000 0 0
6 Comercio ilegal 0.000000000 0.000000000 0 0
geometry
1 MULTIPOLYGON (((467470.7 77...
2 MULTIPOLYGON (((467470.7 77...
3 MULTIPOLYGON (((467470.7 77...
4 MULTIPOLYGON (((467470.7 77...
5 MULTIPOLYGON (((417931.5 77...
6 MULTIPOLYGON (((417931.5 77...
Selección de Zonas Censales con Mayor Densidad
hist(del_dens_zonas$dens_anual, breaks = 100)
# hist(del_dens_zonas[del_dens_zonas$dens_anual>50,]$dens_anual, breaks = 100)Definición de zonas que corresponde al porcentaje (5%) con mayor densidad
n_porc <- porc_df(del_dens_zonas, porcentaje = 5) # n corresponde a 5% datos
n_porc[1] 772
dens_max <- del_dens_zonas %>%
slice_max(dens_anual, n = n_porc) # El 5 % de valores máximos
# Densidades
# mapview(dens_max, zcol = "dens_anual")Conocer que región tiene las zonas con mayor concentración de delitos
regiones_max <- dens_max %>%
st_drop_geometry() %>%
group_by(REGION) %>%
summarise(Cantidad = n()) %>%
arrange(desc(Cantidad))
regiones_maxVisualización de las región máxima
reg_dens_max2 <- dens_max %>%
filter(REGION == 13) %>%
filter(!is.na(dens_anual))
# mapview(reg_dens_max2, zcol = "dens_anual", at= c(0,10,50,100,1000))Visualización de desimad máxima por categoria
unique(del_dens_zonas$Categoria)
categoria_tipo <- "Comercio ilegal"
dens_max_cat <- del_dens_zonas %>%
filter(Categoria==categoria_tipo) %>%
slice_max(dens_anual, n = n_porc)
# mapview(dens_max_cat, zcol = "dens_anual")regiones_max_cat <- dens_max_cat %>%
st_drop_geometry() %>%
group_by(REGION) %>%
summarise(Cantidad = n()) %>%
arrange(desc(Cantidad))
regiones_max_cat
reg_dens_max_cat <- dens_max_cat %>%
filter(REGION == 13) %>%
filter(!is.na(dens_anual))%>%
slice_max(dens_anual, n = 100)
# mapview(reg_dens_max_cat, zcol = "dens_anual")3.5 Densidades con Respecto al Tiempo

categoria_tipo <- "Comercio ilegal"
ts_info <- dens_max %>%
st_drop_geometry() %>%
dplyr::select(Categoria, a_2017_01:a_2022_12) %>%
pivot_longer(cols = a_2017_01:a_2022_12,
names_to = "tiempo", values_to = "densidades") %>%
mutate(tiempo = gsub("a_", "", tiempo),
tiempo = gsub("_", "-", tiempo),
tiempo = ym(tiempo))
head(ts_info)# A tibble: 6 × 3
Categoria tiempo densidades
<chr> <date> <dbl>
1 Comercio ilegal 2017-01-01 22.6
2 Comercio ilegal 2017-02-01 19.8
3 Comercio ilegal 2017-03-01 29.5
4 Comercio ilegal 2017-04-01 0
5 Comercio ilegal 2017-05-01 0
6 Comercio ilegal 2017-06-01 0
Gráficos
Gráficos de Serie de Tiempo Todas las Categorías. Se utilizará la librería Plotly para hacer gráficos dinámicos
pline <- ggplot() +
geom_line(data = ts_info, aes(x = tiempo, y = densidades,
colour = Categoria),
alpha = 0.4) +
xlab('Meses ') +
ylab('Densidades') +
theme_bw()
pline
pline <- ggplot() +
geom_line(data = ts_info, aes(x = tiempo, y = densidades,
colour = Categoria),
alpha = 0.4) +
xlab('Meses ') +
ylab('Densidades') +
theme_bw()+
facet_grid(Categoria ~ .) +
theme(legend.position = "none")
# pline
ggplotly(pline)Gráficos sobre médidas de centralidad (4 Primeras Categorías)
unique(ts_info$Categoria)[1] "Comercio ilegal" "Hurtos, robos"
[3] "Armas y homicidios" "Drogas y mercados criminales"
df_tidy_mean_1 <- ts_info %>%
filter(!is.na(densidades)) %>%
filter(Categoria %in% unique(ts_info$Categoria)) %>%
group_by(tiempo, Categoria) %>%
summarise(n = n(),
mean = mean(densidades),
median = median(densidades),
sd = sd(densidades),
.groups = "keep") %>%
mutate(sem = sd / sqrt(n - 1),
CI_lower = mean + qt((1-0.95)/2, n - 1) * sem,
CI_upper = mean - qt((1-0.95)/2, n - 1) * sem)
mean_plot_1 <- ggplot(df_tidy_mean_1, aes(x = tiempo, y = mean, color = Categoria)) +
geom_line(aes(x = tiempo, y = mean, color = Categoria)) +
geom_ribbon(
aes(ymin = CI_lower, ymax = CI_upper, fill = Categoria),
color = "grey90",
alpha = 0.2 )+
theme_bw()
ggplotly(mean_plot_1)Gráficos Desagregados
color_list <- viridis::viridis(length(unique(ts_info$Categoria)))
mean_plot_1_solos <- ggplot(df_tidy_mean_1, aes(x = tiempo, y = mean, color = Categoria)) +
geom_line(aes(x = tiempo, y = mean, color = Categoria)) +
geom_ribbon(
aes(ymin = CI_lower, ymax = CI_upper, fill = Categoria),
color = "grey90",
alpha = 0.2) +
theme_bw()+
scale_fill_manual(values = color_list) +
scale_color_manual(values = color_list) +
facet_grid(Categoria ~ .) +
theme(legend.position = "none")
ggplotly(mean_plot_1_solos)